import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Dispose {
    public static void exe(String path1, String path2) throws IOException {
        //创建输出流
        FileOutputStream fos = new FileOutputStream(path1);
        //创建工作蒲
        Workbook workbook = new XSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("信息资源");
        CreateTitleContent.createTitle(workbook,sheet);

        List<Table> list = GetTableList.tableList(path2);

        createCellAndWriteList(list,sheet);

        List<Integer> rowList = getRowChange(sheet, list);

        checkCname(rowList,sheet,workbook);
        merged(sheet,rowList);
        upCname(workbook,sheet,list);

        checkDataLen(workbook,sheet,list);

        checkShare(workbook,sheet,list);

        workbook.write(fos);
        fos.close();
        System.out.println("执行成功");
    }



/*    public static void main(String[] args) throws IOException {
        String path = "D:\\江北区民政局信息资源目录.xlsx";

        //创建输出流
        FileOutputStream fos = new FileOutputStream("D:\\999999.xlsx");
        //创建工作蒲
        Workbook workbook = new XSSFWorkbook();
        //创建工作表
        Sheet sheet = workbook.createSheet("信息资源");

        CreateTitleContent.createTitle(workbook,sheet);


        List<Table> list = GetTableList.tableList(path);

        createCellAndWriteList(list,sheet);

        List<Integer> rowList = getRowChange(sheet, list);

        checkCname(rowList,sheet,workbook);
        merged(sheet,rowList);
        upCname(workbook,sheet,list);

        checkDataLen(workbook,sheet,list);

        checkShare(workbook,sheet,list);

        workbook.write(fos);
        fos.close();
        System.out.println("执行成功");
    }*/

    //判断共享条件
    public static void checkShare(Workbook workbook,Sheet sheet,List<Table> list){
        String sxgxtj = "《中华人民共和国政府信息公开条例》第十五条　涉及商业秘密、个人隐私等公开会对第三方合法权益造成损害的政府信息，行政机关不得公开。但是，第三方同意公开或者行政机关认为不公开会对公共利益造成重大影响的，予以公开。";

        for (int i=3; i<list.size()+3; i++){
            Cell cell = sheet.getRow(i).getCell(16);
            String str = cell.getStringCellValue();
            if(str.equals("无条件共享")){//
                Cell cell17w = sheet.getRow(i).getCell(17);
                Cell cell18w = sheet.getRow(i).getCell(18);
                if (!cell17w.getStringCellValue().equals("用于工作参考")){
                    cell17w.setCellValue("用于工作参考");
                    setOtherStyle(workbook,cell17w);
                }
                if(!cell18w.getStringCellValue().equals("无条件开放")){
                    cell18w.setCellValue("无条件开放");
                    setOtherStyle(workbook,cell18w);
                }
            }else if(str.equals("非共享")){
                Cell cell18f = sheet.getRow(i).getCell(18);
                if (!cell18f.getStringCellValue().equals("禁止开放")){
                    cell18f.setCellValue("禁止开放");
                    setOtherStyle(workbook,cell18f);
                }
                Cell cell17f = sheet.getRow(i).getCell(17);
                String scv = cell17f.getStringCellValue();
                if(scv.equals("涉密") || scv.equals("隐私")){
                    continue;
                }else {
                    cell17f.setCellValue("涉密");
                    setOtherStyle(workbook,cell17f);
                }
            }else {
                Cell cell18s = sheet.getRow(i).getCell(18);
                if(cell18s.getStringCellValue().equals("无条件开放")){
                    System.out.println("hhhhhhhhhhh");
                    cell18s.setCellValue("禁止开放");
                    setOtherStyle(workbook,cell18s);
                }
                Cell cell17f = sheet.getRow(i).getCell(17);
                if (checkSxgxtj(cell17f.getStringCellValue())){
                    continue;
                }else {
                    cell17f.setCellValue(sxgxtj);
                    setOtherStyle(workbook,cell17f);
                }
            }
        }
    }



    //判断受限共享条件是否在规范中
    public static boolean checkSxgxtj(String str){
        String sxgxtj1 = "数据安全法第38条国家机关为履行法定职责的需要收集、使用数据，应当在其履行法定职责的范围内依照法律、行政法规规定的条件和程序进行；对在履行职责中知悉的个人隐私、个人信息、商业秘密、保密商务信息等数据应当依法予以保密，不得泄露或者非法向他人提供。";
        String sxgxtj2 = "中华人民共和国民法典第一千零三十二条自然人享有隐私权。任何组织或者个人不得以刺探、侵扰、泄露、公开等方式侵害他人的隐私权。隐私是自然人的私人生活安宁和不愿为他人知晓的私密空间、私密活动、私密信息。";
        String sxgxtj3 = "《中华人民共和国政府信息公开条例》第十四条　依法确定为国家秘密的政府信息，法律、行政法规禁止公开的政府信息，以及公开后可能危及国家安全、公共安全、经济安全、社会稳定的政府信息，不予公开。";
        String sxgxtj4 = "《中华人民共和国政府信息公开条例》第十五条　涉及商业秘密、个人隐私等公开会对第三方合法权益造成损害的政府信息，行政机关不得公开。但是，第三方同意公开或者行政机关认为不公开会对公共利益造成重大影响的，予以公开。";
        String sxgxtj5 = "《中华人民共和国政府信息公开条例》第十六条　行政机关的内部事务信息，包括人事管理、后勤管理、内部工作流程等方面的信息，可以不予公开。";
        HashSet<String> strs = new HashSet<>();
        strs.add(sxgxtj1);
        strs.add(sxgxtj2);
        strs.add(sxgxtj3);
        strs.add(sxgxtj4);
        strs.add(sxgxtj5);
        return strs.contains(str);
    }

    //这个方法用来判断如果数据长度列出现空值，则填充1000，并修改背景颜色为绿色
    public static void checkDataLen(Workbook workbook,Sheet sheet,List<Table> list){
        for (int i=3; i<list.size()+3; i++){
            Cell cell = sheet.getRow(i).getCell(11);
            if (cell.getStringCellValue().equals("")){
                cell.setCellValue("1000");
                setOtherStyle(workbook,cell);
            }
        }
    }

    /*
    这个方法用来判断数据项列，如果数据项出现特殊字符、英文字母、字符中间有数字等情况将其背景色修改为黄色
    如果出现id，则将其变为大写
     */
    public static void upCname(Workbook workbook,Sheet sheet,List<Table> list){
        for (int i=3; i<list.size()+3;i++){
            Cell cell = sheet.getRow(i).getCell(7);
            String str = cell.getStringCellValue();
            //设置一个变量来存储字符串中英文字母的个数
            int temp = 0;
            //遍历字符串中的每个字符，将英文字符记录下来
            for (int m=0; m<str.length(); m++){
                char c = str.charAt(m);
                if(Character.isLowerCase(c) || Character.isUpperCase(c) ){
                    temp++;
                }
            }
            //设置一个变量来存储状态，这个表字符串中出来最后一个字符外没有数字字符
            boolean num = true;
            for (int n=0; n<str.length()-1; n++){
                if(Character.isDigit(str.charAt(n)))
                    num = false;
            }
            //设置一个变量才存储状态，这个表明在字符串大写后，字符串中有ID这个字符串
            boolean id = str.toUpperCase().contains("ID");

            //使用正则表达式来检测字符串中是否有特殊字符
            String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~！@#￥%……&*（）——+|{}【】‘；：”“’。，、？-]|\n|\r|\t";
            Pattern p = Pattern.compile(regEx);
            Matcher m = p.matcher(str);
            boolean b = m.find();

            if(temp==0 && num==true  && b==false){
                //判断如果是没有英文字符的情况，跳过本次循环
                continue;
            }

            //判断是否将这个单元格标记
            if(temp==2 && num==true && id==true && b==false){
                str = str.toUpperCase();
                cell.setCellValue(str);
                //System.out.println("开始将id变为大写-------");
            }else {
                //System.out.println("调用方法------");
                setCnameStyle(workbook,cell);
            }
        }
    }
    //这个方法用来合并单元格
    public static void merged(Sheet sheet,List<Integer> rowList){
        for (int i=0;i<rowList.size()-1;i++){
            //System.out.println(rowList.get(i)+1 + "----" + rowList.get(i+1));
            int first = rowList.get(i);
            int last = rowList.get(i+1)-1;
            sheet.addMergedRegion(new CellRangeAddress(first, last, 0, 0));
            sheet.addMergedRegion(new CellRangeAddress(first, last, 1, 1));
            sheet.addMergedRegion(new CellRangeAddress(first, last, 2, 2));
            sheet.addMergedRegion(new CellRangeAddress(first, last, 3, 3));
            sheet.addMergedRegion(new CellRangeAddress(first, last, 4, 4));
            sheet.addMergedRegion(new CellRangeAddress(first, last, 5, 5));
            sheet.addMergedRegion(new CellRangeAddress(first, last, 6, 6));
        }

    }
    //这个方法用来检查数据项列中每个信息资源的数据项是否有重复，如果出现重复则背景色设为黄色
    public static void checkCname(List<Integer> rowList,Sheet sheet,Workbook workbook){
        for (int i=1;i<rowList.size();i++){
            HashSet<String> str = new HashSet<>();
            for (int j=rowList.get(i-1)+1; j<=rowList.get(i); j++){
                Cell cell = sheet.getRow(j-1).getCell(7);
                String strCname = cell.getStringCellValue();
                if(str.contains(strCname)){
                    setCnameStyle2(workbook,cell);
                }else {
                    str.add(strCname);
                }
            }
            str.clear();
        }
    }
    //将单元格背景色设为黄色
    public static void setCnameStyle(Workbook workbook,Cell cell){
        //设置单元格样式
        CellStyle cellStyle = workbook.createCellStyle();
        //设置单元格背景颜色,设为浅灰色
        cellStyle.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        //将单元格样式设置放入对应的单元格中
        cell.setCellStyle(cellStyle);
    }
    public static void setCnameStyle2(Workbook workbook,Cell cell){
        //设置单元格样式
        CellStyle cellStyle = workbook.createCellStyle();
        //设置单元格背景颜色,设为浅灰色
        cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        //将单元格样式设置放入对应的单元格中
        cell.setCellStyle(cellStyle);
    }
    //将单元格背景色设为绿色
    public static void setOtherStyle(Workbook workbook,Cell cell){
        //设置单元格样式
        CellStyle cellStyle = workbook.createCellStyle();
        //设置单元格背景颜色,设为浅灰色
        cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex());
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        //将单元格样式设置放入对应的单元格中
        cell.setCellStyle(cellStyle);
    }


    //这个方法用于创建包含实际内容的单元格并将List集合中保存的数据写入到新的Excel中
    public static void createCellAndWriteList(List<Table> list,Sheet sheet){
        for (int i=3; i<list.size()+3;i++){
            Row row = sheet.createRow(i);
            for (int j=0;j<19;j++){
                Cell cell = row.createCell(j);
                switch (j){
                    case 0: cell.setCellValue(list.get(i-3).getXxzymc());break;
                    case 1: cell.setCellValue(list.get(i-3).getXxzygsfl());break;
                    case 2: cell.setCellValue(list.get(i-3).getXxzygs());break;
                    case 3: cell.setCellValue(list.get(i-3).getZdlyfl());break;
                    case 4: cell.setCellValue(list.get(i-3).getSsxtmc());break;
                    case 5: cell.setCellValue(list.get(i-3).getUpdateTime());break;
                    case 6: cell.setCellValue(list.get(i-3).getConcreteTime());break;
                    case 7: cell.setCellValue(list.get(i-3).getCname());break;
                    case 8: cell.setCellValue(list.get(i-3).getEname());break;
                    case 9: cell.setCellValue(list.get(i-3).getFieldDescription());break;
                    case 10: cell.setCellValue(list.get(i-3).getDataType());break;
                    case 11: cell.setCellValue(list.get(i-3).getDataLength());break;
                    case 12: cell.setCellValue(list.get(i-3).getIsDict());break;
                    case 13: cell.setCellValue(list.get(i-3).getIsNull());break;
                    case 14: cell.setCellValue(list.get(i-3).getIskey());break;
                    case 15: cell.setCellValue(list.get(i-3).getDefaultValue());break;
                    case 16: cell.setCellValue(list.get(i-3).getShareProperty());break;
                    case 17: cell.setCellValue(list.get(i-3).getShareCondition());break;
                    case 18: cell.setCellValue(list.get(i-3).getOpenProperty());break;
                }
            }
        }
    }

    //这个方法用于得到一个信息资源名称列的变化的行坐标，并存储在list集合中
    public static List<Integer> getRowChange(Sheet sheet,List<Table> list){
        int row = 3;
        List<Integer> rowList = new ArrayList<>();
        rowList.add(3);
        String temp = sheet.getRow(3).getCell(0).getStringCellValue();
        for (int i=3;i<list.size()+3;i++){
            if (sheet.getRow(i).getCell(0).getStringCellValue().equals(temp)){
                continue;
            }
            row = i;
            rowList.add(row);
            temp = sheet.getRow(i).getCell(0).getStringCellValue();
        }
        rowList.add(list.size()+3);
        //System.out.println(rowList);
        return rowList;
    }

}
